package gui;

import dao.FileMeta;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import service.SearchService;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

public class GUIController implements Initializable {
    @FXML
    private GridPane gridPane;
    @FXML
    private Button button;
    @FXML
    private Label label;
    @FXML
    private TextField textField;
    @FXML
    private TableView<FileMeta> tableView;
    // Controller 上的属性不一定是界面上的元素
    private SearchService searchService = null;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 监听器的添加 给输入框加的
        // 需要指定是针对text的内容进行监听
        textField.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                // 这个方法就会在修改输入框内容的时候 被自动调用到
                // oldValue 输入框被改之前的值 旧的值是啥
                // newValue 输入框被改完之后 新的值是啥
                // 此处要干的事 根据新的这个值 重新进行查询
                freshTable(newValue);
            }
        });
    }

    private void freshTable(String query) {
        // 重新查询数据库，把查询结果 设置到表格中
        // 查询操作 依赖这个searchService 对象
        if(searchService == null) {
            System.out.println("searchService 尚未初始化，不能查询");
            return;
        }
        // 先把之前表格中旧的数据干掉，再添加新的数据 需要拿到内部集合类
        ObservableList<FileMeta> fileMetas = tableView.getItems();
        // 清空之前的内容
        fileMetas.clear();
        List<FileMeta> search = searchService.search(query);
        fileMetas.addAll(search);
    }

    // 使用这个方法 作为鼠标点击事件的回调方法 这个方法里需要一个MouseEvent 参数
    public void choose(MouseEvent mouseEvent) {
        // 先创建出一个目录选择器
        DirectoryChooser directoryChooser = new DirectoryChooser();
        // 还需要弹出一个对话框
        Window window = gridPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null) {
            System.out.println("当前用户选择路径为空");
            return;
        }
        System.out.println(file.getAbsoluteFile());

        // 让用户选择的路径显示到label路径中
        label.setText(file.getAbsolutePath());

        // 判定一下当前 searchService 是不是空 如果非空则说明不是第一次扫描
        // 就应该停止上次扫描任务
        if(searchService != null) {
            searchService.shutdown();
        }
        // 让用户选择路径对指定路径进行扫描，把对应的数据加入到数据库中
        searchService = new SearchService();
        searchService.init(file.getAbsolutePath());

    }
}
